import type { Page } from 'playwright-core'
import mainLogger from '../logger'
import { BrowserController } from './browser-controller'

/**
 * 任务接口
 */
export interface ITask {
  name: string
  execute(page: Page): Promise<void>
}

/**
 * 任务执行器 - 管理任务队列和执行
 */
export class TaskExecutor {
  private controller: BrowserController
  private taskQueue: ITask[] = []
  private isRunning = false
  private shouldStop = false

  constructor() {
    this.controller = new BrowserController()
  }

  /**
   * 添加任务到队列
   */
  addTask(task: ITask): void {
    this.taskQueue.push(task)
    mainLogger.info('任务已添加', { taskName: task.name, queueLength: this.taskQueue.length })
  }

  /**
   * 批量添加任务
   */
  addTasks(tasks: ITask[]): void {
    this.taskQueue.push(...tasks)
    mainLogger.info('批量任务已添加', { count: tasks.length })
  }

  /**
   * 执行所有任务
   */
  async execute(headless = true): Promise<void> {
    if (this.isRunning) {
      mainLogger.warn('任务正在执行中，请等待完成')
      return
    }

    if (this.taskQueue.length === 0) {
      mainLogger.warn('任务队列为空')
      return
    }

    this.isRunning = true
    this.shouldStop = false

    try {
      // 启动浏览器
      await this.controller.launch(headless)
      const page = await this.controller.createPage()

      // 执行所有任务
      for (let i = 0; i < this.taskQueue.length; i++) {
        // 检查是否需要停止
        if (this.shouldStop) {
          mainLogger.warn('任务执行已被中止', {
            completedTasks: i,
            totalTasks: this.taskQueue.length
          })
          break
        }

        const task = this.taskQueue[i]
        const progress = 50 + ((i + 1) / this.taskQueue.length) * 40

        mainLogger.info('开始执行任务', {
          taskName: task.name,
          index: i + 1,
          total: this.taskQueue.length
        })
        this.controller.onProgress((p, msg) =>
          mainLogger.debug('任务进度', { progress: p, message: msg })
        )

        try {
          await task.execute(page)
          mainLogger.info('任务执行成功', { taskName: task.name, progress })
        } catch (error) {
          mainLogger.error('任务执行失败', { taskName: task.name, error })
          throw error
        }
      }

      if (!this.shouldStop) {
        mainLogger.info('所有任务执行完成')
      }
    } finally {
      // 关闭浏览器
      await this.controller.close()
      this.taskQueue = []
      this.isRunning = false
      this.shouldStop = false
    }
  }

  /**
   * 停止执行任务
   */
  stop(): void {
    if (!this.isRunning) {
      mainLogger.warn('没有正在执行的任务')
      return
    }
    this.shouldStop = true
    mainLogger.info('已发送停止信号，当前任务完成后将停止')
  }

  /**
   * 清空任务队列
   */
  clearTasks(): void {
    this.taskQueue = []
    mainLogger.info('任务队列已清空')
  }

  /**
   * 获取任务队列状态
   */
  getStatus(): { isRunning: boolean; queueLength: number; shouldStop: boolean } {
    return {
      isRunning: this.isRunning,
      queueLength: this.taskQueue.length,
      shouldStop: this.shouldStop
    }
  }
}
